#include "Joueur_private.h"

/* Constructor */
Joueur* newJoueur(){
	Joueur* j;
	
	j = emalloc(sizeof(Joueur));
	if(j == NULL) return NULL;

	joueurSetNumero(j,joueurGetNextNumero());
	return j;
}

/* Destructor */
void deleteJoueur(Joueur* j){
	free(j);
}

/* Getters */
List* joueurGetPersos(Joueur* joueur){
	eassert(joueur != NULL);
	
	return joueur->persos;
}

ListIterator* joueurGetIt(Joueur* joueur){
	eassert(joueur != NULL);
	
	return joueur->it;
}

TypeJoueur joueurGetType(Joueur* joueur){
	eassert(joueur != NULL);
	
	return joueur->type;
}

Personnage * joueurGetLastPerso(Joueur* joueur){
	eassert(joueur != NULL);
	
	return joueur->lastPerso;
}

int joueurGetNumero(Joueur* joueur){
	eassert(joueur != NULL);
	
	return joueur->numero;
}
/* Settlers */
void joueurSetNumero(Joueur* joueur,int num){
	eassert(joueur != NULL);
	
	joueur->numero = num;
}

void joueurSetNom(Joueur* joueur,char* nom){
	eassert(joueur != NULL);
	
	if(nom == NULL) joueur->nom = NULL;
	
	if(joueur->nom != NULL)
		free(joueur->nom);
	
	joueur->nom = emalloc(strlen(nom) + 1);
	strcpy(joueur->nom,nom);
}

void joueurSetPersos(Joueur* joueur, List* persos){
	eassert(joueur != NULL);
	
	joueur->persos = persos;
}

void joueurSetIt(Joueur* joueur, ListIterator* it){
	eassert(joueur != NULL);
	
	joueur->it = it;
}

void joueurSetLastPerso(Joueur* joueur,Personnage* perso){
	eassert(joueur != NULL);
	
	joueur->lastPerso = perso;
}

Personnage* joueurAskChooseEnnemi(Joueur* joueur,List* p){
	eassert(joueur != NULL);
	eassert(p != NULL);
	
	if(joueur->askChooseEnnemi != NULL)
		return joueur->askChooseEnnemi(joueur,p);

	return NULL;
}

int joueurHasPerso(Joueur* joueur,Personnage* perso){
	if(joueur == NULL) return 0;
	if(perso == NULL) return 0;
	
	return 1;
}

void joueurAddPerso(Joueur* joueur,Personnage* perso){
	if(joueur == NULL) return;
	if(perso == NULL) return;
}

int joueurAskFairePause(Joueur* joueur){
	eassert(joueur != NULL);
	
	if(joueur->askFairePause != NULL)
		return joueur->askFairePause(joueur);
	
	return 1;
}

int joueurAskUsePouvoir(Joueur* joueur,Pouvoir* pouvoir){
	eassert(pouvoir != NULL);
	eassert(joueur != NULL);
	
	if(joueur->askUsePouvoir != NULL)
		return joueur->askUsePouvoir(joueur,pouvoir);
	
	return 1;
}

Personnage* joueurGetNextHero(Joueur* joueur){
	Personnage* perso;
	eassert(joueur != NULL);
	
	if(joueurGetLastPerso(joueur) == NULL){
		perso = joueurAskNextHero(joueur);
		joueurSetLastPerso(joueur,perso);
		return perso;
	}else{
		listForEach(perso,joueurGetPersos(joueur))
			if(persoGetType(perso) == tpHero && perso != joueurGetLastPerso(joueur)){
				joueurSetLastPerso(joueur,NULL);
				return perso;
			}	
	}
	return NULL;
}

Personnage* joueurAskNextHero(Joueur* joueur){
	eassert(joueur != NULL);

	if(joueur->askNextPersonnage != NULL)
		return joueur->askNextPersonnage(joueur);
	
	return NULL;
}

#include <pthread.h>
pthread_mutex_t numero_mutex = PTHREAD_MUTEX_INITIALIZER;
int numero = 0;
int joueurGetNextNumero(){
	int num;
	pthread_mutex_lock(&numero_mutex);
	num = numero++;
	pthread_mutex_unlock(&numero_mutex);
	return num;
}
